package com.jandan.logic;

import java.util.Date;
import java.util.List;

import com.jandan.ui.model.Account;
import com.jandan.ui.model.Article;
import com.jandan.ui.model.BlogArticle;
import com.jandan.ui.model.LearnedWord;
import com.jandan.ui.model.Lesson;
import com.jandan.ui.model.ReviewInfo;
import com.jandan.ui.model.Word;
import com.jandan.ui.model.WordComment;
import com.jandan.ui.model.WordLib;

/**
 * 
 * 这个接口包括了所有提供给表现层是的方法，
 * <p>
 * 包括对
 * <ul>
 * <li>用户</li>
 * <li>词库</li>
 * <li>单词</li>
 * <li>课程</li>
 * <li>生词本</li>
 * <li>已学单词</li>
 * </ul>
 * 的操作。
 * </p>
 * @author Gong Yong
 * @version 1.0
 * @see JWordzImpl
 */
public interface JWordzFacade {
	/*
	 * Account
	 */
	/**
	 * 根据用户名获取用户的账户对象
	 * @param userName 用户名
	 * @return 账户对象
	 */
	public Account getAccount(String userName);

	/**
	 * 根据用户名密码获取账户对象
	 * @param userName 用户名
	 * @param password 密码
	 * @return 账户对象
	 */
	public Account getAccount(String userName, String password);

	/**
	 * 根据用户ID获取账户对象
	 * @param userID 用户ID
	 * @return 账户对象
	 */
	public Account getAccountByUserID(long userID);

	/**
	 * 获取会员总数
	 * @return 会员总数
	 */
	public int getTotalAccountCount();

	/**
	 * 获取所有账户列表
	 * @return 账户对象的List
	 */
	public List<Account> getAllAccountList();

	/**
	 * 获取某部分账户列表，用于分页显示
	 * @param start 起始位置
	 * @param limit 获取数目
	 * @return 账户对象List
	 */
	public List<Account> getAllAccountList(int start, int limit);
	
	/**
	 * 创建账户
	 * @param account 账户对象
	 */
	public void insertAccount(Account account);

	/**
	 * 更新账户
	 * @param account 账户对象
	 */
	public void updateAccount(Account account);

	/**
	 * 删除账户
	 * @param userID 用户ID
	 */
	public void deleteAccount(long userID);
	
	/*
	 * Article
	 */
	
	/**
	 * 获取煎蛋热文列表,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 */
	public List<Article> getAllArticleList();

	/**
	 * 获取最新的n篇煎蛋热文列表,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 */
	public List<Article> getLatestJandanArticleList(int n);

	/**
	 * 创建煎蛋文章,<span style='font-style:italic;'>此方法可能会给被弃用</span>
	 * @param article
	 */
	public void insertArticle(Article article);

	/**
	 * 更新煎蛋文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param article
	 */
	public void updateArticle(Article article);

	/**
	 * 删除煎蛋文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param articleID
	 */
	public void deleteArticle(long articleID);

	/**
	 * 通过文章ID获取煎蛋文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param articleID
	 * @return
	 */
	public Article getArticleByArticleID(long articleID);
	
	/**
	 * 获取一部分煎蛋文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param start
	 * @param limit
	 * @return
	 */
	public List<Article> getAllArticleList(int start, int limit);
	
	/**
	 * 获取煎蛋文章总数,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @return
	 */
	public int getTotalArticleCount();
	
	/*
	 * BlogArticle
	 */
    /**
     * 获取博客文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
     * @param articleID
     * @return
     */
	public BlogArticle getBlogArticleByArticleID(long articleID);

	/**
	 * 获取某类博客文章列表,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param category
	 * @return
	 */
	public int getTotalBlogArticleCountByCategory(String category);

	/**
	 * 获取一部分的某个分类的博客文章列表,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param i
	 * @param limit
	 * @param category
	 * @return
	 */
	public List<BlogArticle> getAllBlogArticleListByCategory(int i, int limit,
			String category);
	
	/**
	 * 获取最新的所有分类文章的一部分，按日期排序,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param start
	 * @param limit
	 * @return
	 */
	public List<BlogArticle> getAllBlogArticleList(int start, int limit);	
	
	
	/**
	 * 获取所有博客文章列表,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @return
	 */
	public List<BlogArticle> getAllBlogArticleList();

	/**
	 * 创建博客文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param article
	 */
	public void insertBlogArticle(BlogArticle article);

	/**
	 * 更新博客文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param article
	 */
	public void updateBlogArticle(BlogArticle article);
	
	/**
	 * 删除博客文章,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @param articleID
	 */
	public void deleteBlogArticle(long articleID);
	
	/**
	 * 获取博客文章总数量,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * @return
	 */
	public int getTotalBlogArticleCount();
	
	/*
	 * WordLib
	 */
	
	/**
	 * 获取所有词库列表
	 * @return 词库列表
	 */
	public List<WordLib> getAllWordLibList();
	
	/**
	 * 获取一定数量词库列表，<strong>用于分页</strong>
	 * @param start 起始位置
	 * @param limit 要获取词库的个数
	 * @return 词库列表
	 */
	public List<WordLib> getAllWordLibList(int start, int limit);


	/**
	 * 根据词库ID获取某个词库
	 * @param wordLibID 词库ID
	 * @return 词库对象
	 */
	public WordLib getWordLibByWordLibID(long wordLibID);

	/**
	 * 获取某个词库的单词总数
	 * @param wordLibID 词库ID
	 * @return 词库的单词总数
	 */
	public int getTotalWordCountOfWordLib(long wordLibID);

	/**
	 * 创建词库
	 * @param wordLib 词库对象
	 */
	public void insertWordLib(WordLib wordLib);

	/**
	 * 更新词库
	 * @param wordLib 词库对象
	 */
	public void updateWordLib(WordLib wordLib);

	/**
	 * 删除某个词库
	 * @param wordLibID 词库ID
	 */
	public void deleteWordLib(long wordLibID);

	/**
	 * 获取词库总数目
	 * @return 词库总数目
	 */
	public int getTotalWordLibCount();	

	/*
	 * Word
	 */
	
	/**
	 * 获取某个单词
	 * @param wordID 单词ID
	 * @return 单词对象
	 */
	public Word getWordByWordID(long wordID);

	/**
	 * 根据英文单词获取某个单词
	 * @param wordEn 英文单词
	 * @return 单词对象
	 */
	public Word getWordByWordEn(String wordEn);

	/**
	 * 获取搜索的单词的总数，用户与增量搜索
	 * @param word	要所有的单词的字符串
	 * @param wordLibID 词库ID
	 * @return 单词总数
	 */
	public int getSearchedWordCount(String word,long wordLibID);

	/**
	 * 获取一定某部分要搜索单词的列表，<strong>用于分页</strong>
	 * @param word   要搜索的英文字符串
	 * @param offset 开始位置
	 * @param limit  结束位置
	 * @param wordLibID
	 * @return
	 */
	public List<Word> getSearchedWordList(String word, int offset, int limit,long wordLibID);
	
	/**
	 * 获取某个词库中某个位置的单词，单词根据字母排序
	 * @param wordLibID 词库ID
	 * @param position  单词所在位置
	 * @return 单词对象
	 */
	public Word getWordOfOnePositionByWordLibID(long wordLibID, int position);
	

	/**
	 * 向某个词库导入单词
	 * @param words     单词数据的字符串列表
	 * @param wordLibID 词库ID
	 */
	public void importWords(String[] words, long wordLibID);

	/**
	 * 获取某个词库的所有单词列表
	 * @param wordLibID 词库ID
	 * @return 单词列表
	 */
	public List<Word> getAllWordListByWordLibID(long wordLibID);

	/**
	 * 获取某个词库某部分单词的列表,<strong>用于分页</strong>
	 * @param wordLibID 词库ID
	 * @param offset    起始位置
	 * @param limit     要获取的单词数目
	 * @return  单词列表
	 */
	public List<Word> getWordListByWordLibID(long wordLibID, int offset,
			int limit);

	/**
	 * 删除某个单词
	 * @param wordID 单词ID
	 */
	public void deleteWord(long wordID);

	/**
	 * 删除某个中文含义和例句对
	 * @param csID 中文例句对ID
	 */
	public void deleteCnAndSentence(long csID);

	/**
	 * 创建某个单词
	 * @param word 单词对象
	 */
	public void insertWord(Word word);

	/**
	 * 更新某个单词
	 * @param word 单词对象
	 */
	public void updateWord(Word word);

	/**
	 * 根据某个英文单词获取某个词库的单词
	 * @param wordEn   英文单词
	 * @param wordLibID  词库ID
	 * @return 单词对象
	 */
	public Word getWordByWordEnAndWordLibID(String wordEn,
			long wordLibID);

	/*
	 * Lesson
	 */
	
	/**
	 * 获取某个用户所有课程列表
	 * @param userID 用户ID
	 */
	public List<Lesson> getLessonListByUserID(long userID);

	/**
	 * 获取某个课程
	 * @param lessonID 课程ID
	 * @return 课程对象
	 */
	public Lesson getLessonByLessonID(long lessonID);

	/**
	 * 删除某个课程
	 * @param lessonID 课程ID
	 */
	public void deleteLesson(long lessonID);

	/**
	 * 获取某个课程的某个小词库的单词
	 * @param lessonID  课程ID
	 * @param libNumber 小词库序号
	 * @return 单词列表
	 */
	public List<Word> getWordListByLessonIDAndLibNumber(long lessonID,
			int libNumber);

	/**
	 * 获取某个课程的某个小词库的新单词，也就是没学过的单词的列表
	 * @param lessonID  课程ID
	 * @param libNumber 小词库序号
	 * @return
	 */
	public List<Word> getNewWordList(long lessonID, int libNumber);	

	/**
	 * 创建课程
	 * @param lesson 课程对象
	 * @return 新创建课程的ID
	 */
	public long insertLesson(Lesson lesson);
	
	/**
	 * 更新课程
	 * @param lesson 课程对象
	 */
	public void updateLesson(Lesson lesson);

	
	/*
	 * LearnedWord
	 */
	
	/**
	 * 获取某个课程的所有已学单词
	 * @param lessonID 课程ID
	 * @return 已学单词列表
	 */
	public List<LearnedWord> getLearnedWordListByLessonID(long lessonID);

	/**
	 * 获取某个课程的某个小词库的已学单词列表
	 * @param lessonID   课程ID
	 * @param libNumber  小词库序号
	 * @return 已学单词列表
	 */
	public List<LearnedWord> getLearnedWordListByLessonIDAndLibNumber(
			long lessonID, int libNumber);

	/**
	 * 获取某个课程的某个小词库的一部分已学单词列表，<strong>用于分页</strong>
	 * @param lessonID   课程ID
	 * @param libNumber  小词库序号
	 * @param start      起始位置
	 * @param count      要获取的数目
	 * @return  已学单词列表
	 */
	public List<LearnedWord> getLearnedWordListByLessonIDAndLibNumber(
			long lessonID, int libNumber, int start, int count);

	/**
	 * 获取某个课程的某个小词库的已学单词总数
	 * @param lessonID  课程ID
	 * @param libNumber 小词库序号
	 * @return  已学单词数目
	 */
	public int getLearnedWordCountByLessonIDAndLibNumber(long lessonID,
			int libNumber);

	/**
	 * 创建或者更新已学单词
	 * @param learnedWord 已学单词对象
	 */
	public void insertOrUpdateLearnedWord(LearnedWord learnedWord);
	
	/**
	 * 根据开始学习日期获取某个课程的已学单词数目
	 * @param lessonID  课程ID
	 * @param date      单词的开始学习日期
	 * @return 已学单词列表
	 */
	public List<LearnedWord> getLearnedWordListByLessonIDAndDate(long lessonID,
			Date date);

	/**
	 * 获取某个课程的已学单词总数
	 * @param lessonID  课程ID
	 * @return 已学单词数目
	 */
	public int getTotalLearnedWordCount(long lessonID);

	/**
	 * 获取某个课程所有熟悉度为掌握的已学单词数目
	 * @param lessonID 单词ID
	 * @return 熟悉度为掌握的已学单词数目
	 */
	public int getTotalMasterWordCount(long lessonID);

	/**
	 * 获取某个课程的所有熟悉度为知道的已学单词数目
	 * @param lessonID 课程ID
	 * @return 熟悉度为知道的已学单词数目
	 */
	public int getTotalKnowWordCount(long lessonID);

	/**
	 * 获取某个课程的所有熟悉度为陌生的已学单词数目
	 * @param lessonID 课程ID
	 * @return 熟悉度为陌生的已学单词数目
	 */
	public int getTotalUnknowWordCount(long lessonID);

	/*
	 * Strange Word
	 */

	/**
	 * 获取某个位置的生词
	 * @param userID
	 * @param position
	 * @return
	 */
	public Word getStrangeWordOfOnePositionByUserID(long userID, int position);
	
	/**
	 * 获取某个用户生词本中某部分单词，<strong>用于分页</strong>
	 * @param userID 用户ID
	 * @param offset 起始位置
	 * @param limit 要获取生词的数目
	 * @return 单词列表
	 */
	public List<Word> getStrangeWordListByUserID(long userID, int offset,
			int limit);
	
	/**
	 * 获取某个用户的生词总数
	 * @param userID 用户ID
	 * @return 生词总数
	 */
	public int getStrangeWordCountByUserID(long userID);
	
	/**
	 * 创建生词
	 * @param word 单词对象
	 * @param userID 用户ID
	 */
	public void insertStrangeWord(Word word, long userID);
	
	/**
	 * 获取某个用户的所有生词
	 * @param userID 用户ID
	 * @return 生词列表
	 */
	public List<Word> getStrangeWordListByUserID(long userID);
	
	/**
	 * 获取所有未学习的生词列表,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * <p>现在所开发的版本允许学习生词，但这一功能会被删除，所以这个方法基本不用管</p>
	 * @param userID 用户ID
	 * @param groupNumber 生词组的序号，类似小词库的序号
	 * @return 生词列表
	 */
	public List<Word> getNewStrangeWordList(long userID, int groupNumber);

	/**
	 * 获取已学的生词列表 ,<span style='font-style:italic;'>此方法可能会被弃用</span>
	 * <p>现在所开发的版本允许学习生词，但这一功能会被删除，所以这个方法基本不用管</p>
	 * @param userID      用户ID
	 * @param groupNumber 生词组的序号，类似小词库的序号
	 * @return 生词列表
	 */
	public List<LearnedWord> getLearnedStrangeWordList(long userID,
			int groupNumber);

	/**
	 * 获取某个用户所有的生词
	 * @param userID 用户ID
	 * @return 生词列表
	 */
	public List<Word> getAllStrangeWordList(long userID);

	/**
	 * 获取所有已学生词的列表
	 * @param userID 用户ID
	 * @return 已学生词列表
	 */
	public List<LearnedWord> getAllLearnedStrangeWordList(long userID);

	
	/*
	 *WordComment 
	 */

	/**
	 * 根据单词ID获取其所有评论
	 * @param wordID 单词ID
	 * @return 单词评论列表
	 */
	public List<WordComment> getWordCommentListByWordID(long wordID);

	/**
	 * 创建单词评论
	 * @param wordComment 单词评论
	 * @return 评论ID
	 */
	public long insertWordComment(WordComment wordComment);

	/**
	 * 获取某个单词的所有评论
	 * @param wordID 单词ID 
	 * @return 评论总数
	 */
	public int getWordCommentCountByWordID(long wordID);

	/*
	 * ReviewInfo
	 */

	/**
	 * 获取某个课程当天的所有的复习信息
	 * <p>
	 * 单词的复习分为两部分
	 * <ul>
	 * 	<li>复习当天单词</li>
	 *  <li>复习以前学的单词</li>
	 * </ul>
	 * </p>
	 * @param lessonID 课程ID
	 * @return 复习信息列表
	 */
	public List<ReviewInfo> getReviewInfoListByToday(long lessonID);

	/**
	 * 获取某一天的复习信息
	 * @param lessonID 课程信息
	 * @param date 日期
	 * @return 复习信息
	 */
	public ReviewInfo getReviewInfoOfSomeDay(long lessonID, Date date);

	/**
	 * 获取某个课程当天的复习信息
	 * @param lessonID 课程ID
	 * @return 复习信息
	 */
	public ReviewInfo getTodayReviewInfo(long lessonID);
}
